package demo.java.a_tag;

import java.io.IOException;
import java.io.StringWriter;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.SkipPageException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;

/**
 * 标签处理器类
 * */

public class demo02_tag extends SimpleTagSupport{
	
	//1、声明属性的成员变量
	private Integer num;
	
	//2、关键点：必须提供公开的setter方法，用于给属性赋值
	public void setNum(Integer num){
		this.num=num;
	}
	
	@Override
	public void doTag() throws JspException, IOException {
		/**
		 * 1、得到标签提内容
		 * 注意：输出调用 jspFragment.invoke()方法，不输出便不需要调用
		 * 但是，如果jspFragment.invoke(null)，输出null的话，仍然会输出标签体内容
		 * */
		//1.1 等到标签体内容
		JspFragment jspBody=this.getJspBody();
		/* 1.2 写入内容到浏览器
		 * 1) 通过获取内容到JspWriter中进行输出
		 * 2) 通过直接以null输出
		 * */
		//1、内容写入out中
		//JspWriter out=this.getJspContext().getOut();
		//jspBody.invoke(out);
		//2、直接传入null
		//jspBody.invoke(null);
		/**
		 * 2、不输出标签体内容
		 * */
		//不输出，什么都不写就是不输出标签体内容
		/**
		 * 3、重复输出标签体内容
		 * */
		//控制标签体重复输出标签体内容
		/*for(int i=0;i<5;i++){
			jspBody.invoke(null);
		}*/
		/**
		 * 4、改变标签体内容输出
		 * */
		//4.1、获取标签体内容到内存，也就是将标签体的内容先写入到一个Write流中，然后冲输出流中取出来存入字符串
		StringWriter strWriter=new StringWriter();
		jspBody.invoke(strWriter);
		String content=strWriter.toString();
		content="对标签体的内容已经进行了更改";
		//4.2、手动写出
		JspWriter out=this.getJspContext().getOut();
		out.write(content);
		//控制余下内容是否输出
		throw new SkipPageException();
	}
}
